package com.gitee.taotaojs.mybootsuper.utils;

import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileItemFactory;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author TaoTaojs
 * @date 2021/7/5 下午4:38
 * <p>Description</p>
 * <h2>功能描述</h2>
 * 测试工具类
 * <h3>主要功能：</h3>
 * <ol>
 *     <li>测试文件上传/导入 - 把File转化为CommonsMultipartFile</li>
 * </ol>
 * <h3>关联类</h3>
 * <p>参考链接：</p>
 * <h2>更新日志</h2>
 * [author]        [time]                      [version]          [desc]
 * TaoTaojs        2021/7/5 下午4:38             V1.0              测试文件上传/导入
 */

public class TestUtil {

    static final int FILE_LENGTH = 8192;

    /**
     * 把File转化为CommonsMultipartFile
     * 使用方式：
     * File destFile = new File("/Users/work/WorkspacesIDEA/public/uploadfile/1111导入进货价.xlsx");
     * FileItem fileItem = createFileItem(destFile, "file");
     * MultipartFile file = new CommonsMultipartFile(fileItem);
     * @param file
     * @param fieldName
     * @return
     */
    public static FileItem createFileItem(File file, String fieldName) {
        //DiskFileItemFactory()：构造一个配置好的该类的实例
        //第一个参数threshold(阈值)：以字节为单位.在该阈值之下的item会被存储在内存中，在该阈值之上的item会被当做文件存储
        //第二个参数data repository：将在其中创建文件的目录.用于配置在创建文件项目时，当文件项目大于临界值时使用的临时文件夹，默认采用系统默认的临时文件路径
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        //fieldName：表单字段的名称；第二个参数 ContentType；第三个参数isFormField；第四个：文件名
        FileItem item = factory.createItem(fieldName, "text/plain", true, file.getName());
        int bytesRead = 0;
        byte[] buffer = new byte[FILE_LENGTH];
        FileInputStream fis = null;
        OutputStream os = null;
        try {
            fis = new FileInputStream(file);
            os = item.getOutputStream();
            while ((bytesRead = fis.read(buffer, 0, FILE_LENGTH)) != -1) {
                //从buffer中得到数据进行写操作
                os.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return item;
    }

}
